#include "../head.h"

static int fd = -1;
static int *plcd = NULL;

void lcd_init()
{
	fd = open("/dev/fb0", O_RDWR);
	if (fd == -1)
	{
		perror("open fb0 error");
		exit(1);
	}
	plcd = mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
	if (plcd == MAP_FAILED)
	{
		perror("mmap lcd error");
		exit(1);
	}
	printf("lcd init success!\n");
}

void lcd_draw_point(int x, int y, int color)
{
	*(plcd + 800 * y + x) = color;
}
char* scale_rgb888(const char *src_rgb888, int src_width, int src_height, int dst_width, int dst_height)
{
    char *dst_rgb888 = (char *)malloc(dst_width * dst_height * 3);
    if (!dst_rgb888) {
        perror("malloc error");
        exit(1);
    }

    float scale_x = (float)src_width / dst_width;
    float scale_y = (float)src_height / dst_height;

    int src_x, src_y;
    int dst_index = 0;

    for (int j = 0; j < dst_height; ++j) {
        for (int i = 0; i < dst_width; ++i) {
            src_x = (int)(i * scale_x);
            src_y = (int)(j * scale_y);

            int src_index = (src_y * src_width + src_x) * 3;
            dst_rgb888[dst_index++] = src_rgb888[src_index + 0]; // R
            dst_rgb888[dst_index++] = src_rgb888[src_index + 1]; // G
            dst_rgb888[dst_index++] = src_rgb888[src_index + 2]; // B
        }
    }

    return dst_rgb888;
}
void lcd_draw_rgb888(char *rgb888, int width, int height, int x, int y)
{
	int i, j;
	char r, g, b;
	int color;
	 char *p = rgb888; //非全屏
	//char *p = scale_rgb888(rgb888, width, height, 800, 480);//全屏
	for (i = 0; i < height; ++i)
	{
		for (j = 0; j < width; ++j)
		{
			b = *p++;
			g = *p++;
			r = *p++;
			color = r << 16 | g << 8 | b;
			lcd_draw_point(j + x, i + y, color);
		}
	}
}
// void lcd_draw_rgb888_scaled(char *rgb888, int width, int height)
// {
//     // 计算缩放比例
//     float scale_x = 800.0 / width;
//     float scale_y = 480.0 / height;

//     // 缩放图像数据并显示到 LCD
//     int dst_width = 800;
//     int dst_height = 480;
//     int src_x, src_y;
//     int i, j;
//     char *p_src = rgb888;
//     char r, g, b;
//     int color;

//     for (j = 0; j < dst_height; ++j)
//     {
//         for (i = 0; i < dst_width; ++i)
//         {
//             // 计算源图像的位置
//             src_x = i / scale_x;
//             src_y = j / scale_y;

//             // 计算源图像数据的偏移量
//             int src_index = (src_y * width + src_x) * 3;
//             r = p_src[src_index + 0];
//             g = p_src[src_index + 1];
//             b = p_src[src_index + 2];
//             color = r << 16 | g << 8 | b;

//             // 绘制到 LCD
//             lcd_draw_point(i, j, color);
//         }
//     }
// }


void lcd_uninit()
{
	munmap(plcd, 800 * 480 * 4);
	close(fd);
	printf("lcd_uninit!\n");
}